<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
<script>
// 英文：
  // * constructor - 构造器  ≈  构造函数


/* Q：面试问题 请介绍一下 箭头函数：
  箭头函数是 ES6 新出的技术
  why？ 为什么要出现 箭头函数呢？
    1. 箭头函数让函数声明 更加简单：
      1）省略了 function ，用 `=>` 替代函数的声明
      2）当形参只有一个时，可以省略 `()`
      3）当返回值是 一个表达式 时，还可以省略 `{}` 和 return
    2. 箭头函数还省略了 内部的一些关键字：
      1）省略了  this 
      2）省略了 arguments
    3. 箭头函数的声明： const fn = () => {函数体}
*/

/* 
  Symbol()  ->  返回值是 基础数据类型 'symbol'

  Symbol.iterator  但凡 变量中，有 这个 属性方法，  即代表 该 变量 可以使用：
    1） ...运算符 
    2）for of  (object 除外)
*/

/* Set 和 Map  ，本质都是  JS  提供的 默认/原生的 “构造函数”
  // Set 作用：本质是 数学上的 「集合」 ，即同类型元素，只能在集合中出现一次。
  // 加入 初始值
    const s = new Set([1, 2, 3, 1, 2, 3]);
    s.add('item值')// 增
    s.delete('item值') // 删
    s.clear() // 清除所有
    s.has('item') // 查看该 item 是否存在，返回值为 布尔值
    s.forEach()
  
  // Map 作用：本质是「字典」/ dict，即 键值对， key -> value；
      注：对象的表现形式，也是 字典
    Map VS 对象：对象的 key 只能是 字符串，而 map 的key 可以是 任意类型的变量

    const m = new Map([
      [key1, value1],
      [key2, value2],
      ...
    ]);
    m.set(key, value) // 增
*/

// 对象的解构赋值
// 解构赋值干了两件事情：1）声明变量 - aa， 2）给变量 aa 赋值为 'xxx'
  // 注：对象的解构赋值，根据的是 key 的 名字 进行匹配赋值
const { name: parentName, age: aa, child: {name: childName} } = { name: 'hong', age: 'xxx', child: {name: 'ming'} }
// console.log(parentName, childName);


// 数组的解构赋值
  // 注：数组的解构赋值，根据的是 index 进行匹配赋值
const [x, y] = [1, ];

console.log(x, y );


// 函数参数的结构赋值

// 函数声明时候的解构赋值
const add = (...args) => {
  console.log(args);
}

// add(1, 2, 3, 4, 5); // args: [1, 2, 3, 4, 5]

// 
add(...[1, 2, 3, 1, 2, 3]); // args: [1, 2, 3, 1, 2, 3]



</script>